/**
 * DiceView erzeugt eine grafische Darstellung f�r die interne Repraesentation
 * des Wuerfels aus DiceModel.
 *
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.dice;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;


public class DiceView extends JPanel 
{
    /**
     * Das zum View dazugehoerige Model.
     */
    private DiceModel model = null;
    
    /**
     * Grafikkomponente, die den Wuerfel darstellt.
     */
    private ImageComponent image;
        
    /**
     * Der Konstruktor erstellt hauptsaechlich einen Controller und uebergibt
     * diesem das Model und die eigene Instanz. Anschliessend registriert es sich
     * beim View um zukuenftig ueber Aenderungsvorgaenge "informiert" zu werden.
     * Letztendlich wird ein grafischer Anfangszustand erzeugt.
     *
     * @param model Das dazugehoerige DiceModel.
     */
    public DiceView(DiceModel model) {
        this.model = model;
        
        // eigene Instanz beim Model registrieren
        model.registerView(this); 
        // Darstellung initialisieren
        initializeView();
    }
    
    /**
     * Die Methode erzeugt einen grafischen Anfangszustand fuer den View.
     * Unter einem Button wird in einem BoxLayout eine Grafik angeordnet,
     * die spueter den Wuerfel repraesentiert.
     */
    private void initializeView() { 
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        
        // Grafikkomponente initialisieren und zum Panel hinzufuegen
        this.image = new ImageComponent("risk/images/wuerfel0.gif");
        this.add(image);
    }
    
    /**
     * Aktuelle Augenzahl des Wuerfels ermitteln und entsprechend eine
     * Grafik in Panel ausgeben. Die Methode wird vom dazugehoerigen Model
     * angestossen. 
     *
     * @param index  Registrierungsindex beim Model.
     */
    
    public void update(int index) {   
        // Augenzahl vom Model beziehen...
        int pips = model.getPips(index);

        // ... und entsprechende Grafikkomponente auf dem View aktualisieren
        this.image.update("risk/images/wuerfel" + pips + ".gif");
        repaint();
    } 
    
    /**
     * Aktuelle view zuruecksetzen auf die Standardgrafik.
     */
    public void reset() {
        this.image.update("risk/images/wuerfel0.gif");
    }
}